package com.qk.common.util;

import jakarta.servlet.http.HttpServletRequest;

/**
 * @Author:gzc
 * @Date: 2025/10/10 9:42
 * @Description:
 */
public class IPUtils {
    /**
     * 获取用户真实IP（支持代理、负载均衡场景）
     */
    public static String getClientIp(HttpServletRequest request) {
        // 1. 优先从X-Forwarded-For获取（多层代理时，第一个IP是用户真实IP）
        String ip = request.getHeader("X-Forwarded-For");
        if (isValidIp(ip)) {
            // 多个IP用逗号分隔，取第一个非unknown的IP
            String[] ips = ip.split(",");
            for (String s : ips) {
                String trimIp = s.trim();
                if (isValidIp(trimIp) && !"unknown".equalsIgnoreCase(trimIp)) {
                    return trimIp;
                }
            }
        }

        // 2. 从X-Real-IP获取（通常是单跳代理的用户IP）
        ip = request.getHeader("X-Real-IP");
        if (isValidIp(ip)) {
            return ip;
        }

        // 3. 从Proxy-Client-IP获取（部分代理会用）
        ip = request.getHeader("Proxy-Client-IP");
        if (isValidIp(ip)) {
            return ip;
        }

        // 4. 最后从RemoteAddr获取（无代理时直接是用户IP，有代理时是代理IP）
        ip = request.getRemoteAddr();
        return ip;
    }

    /**
     * 校验IP是否有效（非空、非unknown）
     */
    private static boolean isValidIp(String ip) {
        return ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip);
    }
}
